from fastapi import FastAPI, Query
from pydantic import BaseModel
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from sqlalchemy.ext.asyncio import AsyncSession

# Определение модели Customer
class Customer(BaseModel):
    id: int
    name: str

# Создание экземпляра FastAPI приложения
app = FastAPI()

# Параметры подключения к базе данных
DATABASE_URL = "sqlite+aiosqlite:///./customers.db"

# Создание объекта двигателя SQLAlchemy
engine = create_engine(DATABASE_URL)

# Создание объекта сессии SQLAlchemy
async_session = AsyncSession(engine)

@app.on_event("startup")
async def startup():
    """Запуск сессии SQLAlchemy при старте приложения."""
    await async_session.begin()

@app.on_event("shutdown")
async def shutdown():
    """Закрытие сессии SQLAlchemy при остановке приложения."""
    await async_session.close()

# Метод для получения всех клиентов
@app.get("/customers")
async def get_all_customers(db: AsyncSession = Depends(get_db)):
    """Получение всех клиентов."""
    customers = db.execute("SELECT * FROM customers").scalars().all()
    return [Customer(id=c.id, name=c.name) for c in customers]

# Метод для получения клиентов постранично
@app.get("/customers/{page}")
async def get_customers_by_page(page: int = Query(..., ge=1), db: AsyncSession = Depends(get_db)):
    """Получение клиентов постранично."""
    offset = (page - 1) * 10
    customers = db.execute("SELECT * FROM customers ORDER BY id LIMIT 10 OFFSET :offset", offset=offset).scalars().all()
    return [Customer(id=c.id, name=c.name) for c in customers]

# Функция для получения сессии SQLAlchemy
async def get_db():
    """Возвращает новую или существующую сессию SQLAlchemy."""
    async with async_session.begin():
        yield async_session